/**
 * @author komasshu
 */
//////////////////////////////////////////////////
// DataCache オブジェクト
//////////////////////////////////////////////////
ols = window.ols ? window.ols : {};

(function(){
	ols.DataCache = {};
	
	/**
	 * 作成
	 */
	ols.DataCache.create = function(opt_title, opt_body, opt_tag){
		var title_ = typeof(opt_title) !== "string" ? "" : opt_title;
		var body_ = typeof(opt_body) !== "string" ? "" : opt_body;
		var tag_ = typeof(opt_tag) !== "string" ? "" : opt_tag;
		var curr_ = new Date().getTime();
		var id_ = "memo_"+curr_;
		
		var obj_ = {
			id: id_,
			title: title_,
			body: body_,
			tag: tag_,
			created_at: curr_,
			last_update: curr_
		}
		
		localStorage[id_] = JSON.stringify(obj_);
		
		return id_;
	}
	
	/**
	 * メモ一覧の取得
	 */
	ols.DataCache.get = function(){
		var ret_ = []; // 返値の初期化
		
		// プレフィックスが"memo_"のデータを取得
		for(var key in localStorage) {
			if(key.indexOf("memo_") == 0)
				ret_.push(JSON.parse(localStorage[key]));
		}
		
		return ret_;
	}
	
	/**
	 * メモを更新する
	 */
	ols.DataCache.update = function(opt_id, opt_prop, opt_val) {
		if(validateID(opt_id) && validateProperty(opt_prop, opt_val)) {
			//　更新前データを取得
			var obj_ = JSON.parse(localStorage[opt_id]);
			
			// 更新処理
			obj_[opt_prop] = opt_val;
			obj_.last_update = new Date().getTime();
			
			localStorage[opt_id] = JSON.stringify(obj_);
		}
	}
	
	/**
	 * メモの削除
	 */
	ols.DataCache.remove = function(opt_id){
		if (validateID(opt_id)) {
			// 削除
			localStorage.removeItem(opt_id);
			
			return true;
		}
	}
	
	
	// validator
	//////////////////////////////////////////
	/**
	 * IDのvalidate
	 * 
	 * @param {string} opt_id
	 */
	function validateID(opt_id) {
		if(typeof(opt_id) === "string" || 
			opt_id.indexOf('memo_') == 0 || 
			localStorage.hasOwnProperty(opt_id)){
			return true;
		} else {
			throw("ID error::"+opt_id);
		}
	}
	
	/**
	 * propertyのvalidate
	 * 
	 * @param {string} opt_prop
	 * @param {string} opt_val
	 */
	function validateProperty(opt_prop, opt_val) {
		var v_ = {
			title: function(val) {
				return(typeof(val) === "string");
			},
			tag: function(val) {
				return(typeof(val) === "string" && val.match(/^[0-9a-zA-Z]{0,10}$/))
			},
			body: function(val) {
				return(typeof(val) === "string");
			}
		}

		if(typeof(opt_prop) !== "string" || !v_.hasOwnProperty(opt_prop))
			throw("property name is not permitted::"+opt_prop);
		
		if(v_[opt_prop]) {
			return true;
		} else {
			throw("format error::"+opt_prop+" => "+opt_val);
		}
	}
	
})();
